/*
 * @Author: laladuduqq
 * @Date: 2024-12-23 16:56:20
 * @LastEditors: laladuduqq
 * @LastEditTime: 2024-12-23 23:06:16
 */
#ifndef __MESSAGE_H
#define __MESSAGE_H

#include "stdint.h"
#include "rtthread.h"

#define MAX_TOPIC_NAME_LEN 32 // 最大的话题名长度,每个话题都有字符串来命名
#define MAX_TOPIC_COUNT 12    // 最多支持的话题数量
#define QUEUE_SIZE 10         // 消息队列大小

typedef struct mqt
{
    /* 用消息队列模拟FIFO队列 */
    rt_mq_t mq;
    uint8_t data_len;
    struct mqt *next_subs_queue; // 使得发布者可以通过链表访问所有订阅了相同话题的订阅者
} Subscriber_t;

typedef struct ent
{
    /* 话题名称 */
    char topic_name[MAX_TOPIC_NAME_LEN + 1]; // 1个字节用于存放字符串结束符 '\0'
    uint8_t data_len;                        // 该话题的数据长度
    /* 指向第一个订阅了该话题的订阅者,通过链表访问所有订阅者 */
    Subscriber_t *first_subs;
    /* 指向下一个Publisher的指针 */
    struct ent *next_topic_node;
    uint8_t pub_registered_flag; // 用于标记该发布者是否已经注册
    rt_list_t list;              // RT-Thread链表节点
} Publisher_t;

Subscriber_t *SubRegister(char *name, uint8_t data_len);
Publisher_t *PubRegister(char *name, uint8_t data_len);
uint8_t SubGetMessage(Subscriber_t *sub, void *data_ptr);
uint8_t PubPushMessage(Publisher_t *pub, void *data_ptr);

#endif